﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Stl.Controls
{
    /// <summary>
    /// Le contrôle ComboBoxEnh étend le control ComboBox en offrant deux fonctionnalités supplémentaires.
    /// - Validé : memoriser une chaine de caractères.
    /// - Annulé : restaurer la chaine de caracteres précedement sauvegardée.
    /// </summary>
    public partial class ComboBoxEnh : ComboBox
    {
        /// <summary>
        /// Propriété "Validé".
        /// </summary>
        public bool TextValidate { get; set; }

        /// <summary>
        /// Propriété "Annulé".
        /// </summary>
        public bool TextCancel { get; set; }

        /// <summary>
        /// Text mémorisé.
        /// </summary>
        private string textMemoried;

        /// <summary>
        /// Evènements déclenchés pour la validation et l'annulation.
        /// </summary>
        public event EventHandler<TextValidatingEventArgs> TextValidating;
        public event EventHandler<EventArgs> TextValidated;
        public event EventHandler<CancelEventArgs> TextCancelling;
        public event EventHandler<EventArgs> TextCancelled ;

        /// <summary>
        /// Constructeur.
        /// </summary>
        public ComboBoxEnh()
        {
            InitializeComponent();
        }

        protected virtual void OnTextValidating(TextValidatingEventArgs e)
        {
            if (TextValidating != null) TextValidating(this, e);
        }

        protected virtual void OnTextValidated(EventArgs e)
        {
            if (TextValidated != null) TextValidated(this, e);
        }

        protected virtual void OnTextCancelling(CancelEventArgs e)
        {
            if (TextCancelling != null) TextCancelling(this, e);
        }

        protected virtual void OnTextCancelled(EventArgs e)
        {
            if (TextCancelled != null) TextCancelled(this, e);
        }

        /// <summary>
        /// Gestion de l'évenement d'une touche du clavier enfoncée.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ComboBoxEnh_KeyPress(object sender, KeyPressEventArgs e)
        {
            base.OnTextChanged(e);
            if (e.KeyChar == (char)Keys.Return)
            {
                e.Handled = true;
                if (!TextValidate || this.DropDownStyle == ComboBoxStyle.DropDownList) return;
                TextValidatingEventArgs tvea = new TextValidatingEventArgs();
                tvea.Text = this.Text;
                OnTextValidating(tvea);

                if (tvea.Cancel) return;

                this.Text = tvea.Text;
                textMemoried = this.Text;

                OnTextValidated(new EventArgs());
            }
            else
            {
                if (e.KeyChar == (char)Keys.Escape)
                {
                    if (TextValidate && TextCancel)
                    {
                        CancelEventArgs tcea = new CancelEventArgs();
                        OnTextCancelling(tcea);
                        if (tcea.Cancel) return;
                        this.Text = textMemoried;
                        OnTextCancelled(new EventArgs());
                    }
                }
            }
        }
    }

    /// <summary>
    /// EventArgs pour l'évenement TextValidating
    /// </summary>
    public class TextValidatingEventArgs : CancelEventArgs
    {
        public string Text { get; set; }
    }
}
